En C++, chaque expression produit soit une lvalue soit une rvalue. Cette distinction détermine si une expression fait référence à l’ identité (où elle se trouve) ou à sa valeur (ce qu’elle contient).
1. Identité vs. Contenu
Une lvalue (valeur d'emplacement) représente un objet ayant une adresse mémoire persistante. Pensez-y comme une boîte étiquetée en mémoire vive. En revanche, une rvalue (valeur de lecture) est transitoire ; elle représente un résultat temporaire ou une constante littérale qui n’a pas d’adresse accessible au programmeur.
2. Transitions fonctionnelles
Alors qu’une lvalue peut agir comme une rvalue (le compilateur récupère simplement la valeur à l’intérieur de la boîte), la situation inverse est interdite. Vous ne pouvez pas utiliser une rvalue là où une lvalue est requise — par exemple, vous ne pouvez pas obtenir l’adresse d’un nombre littéral comme &42 car elle n’a pas d’identité persistante.
$$ \text{Lvalue} \xrightarrow{\text{Conversion}} \text{Rvalue} \quad (\text{Autorisé}) $$
$$ \text{Rvalue} \xrightarrow{\text{Affectation}} \text{Lvalue} \quad (\text{Interdit}) $$